home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utilsys / rss14gmd.lha / RSys_1.4gmd / C / ShowFont.c < prev    next >
C/C++ Source or Header  |  1996-05-04  |  10KB  |  450 lines

  1. /*
  2.    ***************************************************************************
  3.    *
  4.    * Datei:
  5.    *      RSysShowFont.c
  6.    *
  7.    * Inhalt:
  8.    *
  9.    *      --- Globale Routinen ---
  10.    *
  11.    *    void ShowFont ( TEXTFONT *tf );
  12.    *
  13.    *      --- Lokale  Routinen ---
  14.    *
  15.    *    static int BoldCGadClicked ( void );
  16.    *    static int HandleShowFontIDCMP ( void );
  17.    *    static int ItalicCGadClicked ( void );
  18.    *    static int NormalCGadClicked ( void );
  19.    *    static int OpenShowFontWindow ( void );
  20.    *    static int UnderlineCGadClicked ( void );
  21.    *    static void clipWindow ( WINDOW *win , LONG minX , LONG minY , LONG maxX , LONG maxY );
  22.    *    static void IsNoAttrib ( void );
  23.    *    static void Set ( int num , int checked );
  24.    *    static void SetAttr ( int attrib );
  25.    *    static void ShowFontRender ( TEXTATTR *tfont );
  26.    *    static void unclipWindow ( WINDOW *win );
  27.    *
  28.    * Bemerkungen:
  29.    *      Enthält die Routinen zur Darstellung eines beliebig
  30.    *      großen Fonts. Benutzt Clip-Routinen der Layers-Library.
  31.    *
  32.    * Erstellungsdatum:
  33.    *      12-Jul-93     Rolf Böhme
  34.    *
  35.    * Änderungen:
  36.    *      12-Jul-93     Rolf Böhme        Erstellung
  37.    *
  38.    ***************************************************************************
  39.  */
  40.  
  41. #include "RSys.h"
  42. #include "protos.h"
  43.  
  44. static int NormalCGadClicked (void);
  45. static int ItalicCGadClicked (void);
  46. static int BoldCGadClicked (void);
  47. static int UnderlineCGadClicked (void);
  48. static int HandleShowFontIDCMP (void);
  49.  
  50. static WINDOW *ShowFontWnd = NULL;
  51. static GADGET *ShowFontGList = NULL;
  52. static INTUIMESSAGE ShowFontMsg;
  53. static GADGET *ShowFontGadgets[4];
  54. static UWORD ShowFontLeft = 0;
  55. static UWORD ShowFontTop = 0;
  56. static UWORD ShowFontWidth = 500;
  57. static UWORD ShowFontHeight = 120;
  58. static UBYTE *ShowFontWdt = (UBYTE *) NAME " - Show Font";
  59. static char *testtext;
  60. static INTUITEXT ShowFontIText[] =
  61. {
  62.   1, 2, JAM2, 76, 11, NULL, NULL, NULL
  63. };
  64.  
  65. static TEXTATTR testfont;
  66.  
  67. static UWORD ShowFontGTypes[] =
  68. {
  69.   CHECKBOX_KIND,
  70.   CHECKBOX_KIND,
  71.   CHECKBOX_KIND,
  72.   CHECKBOX_KIND,
  73.   BUTTON_KIND
  74. };
  75.  
  76. static NEWGADGET ShowFontNGad[] =
  77. {
  78.   12, 104, 26, 11, (UBYTE *) "Normal", NULL, GD_NormalCGad, PLACETEXT_RIGHT, NULL, (APTR) NormalCGadClicked,
  79.   141, 104, 26, 11, (UBYTE *) "Italic", NULL, GD_ItalicCGad, PLACETEXT_RIGHT, NULL, (APTR) ItalicCGadClicked,
  80.   270, 104, 26, 11, (UBYTE *) "Bold", NULL, GD_BoldCGad, PLACETEXT_RIGHT, NULL, (APTR) BoldCGadClicked,
  81.   400, 104, 26, 11, (UBYTE *) "Underl", NULL, GD_UnderlineCGad, PLACETEXT_RIGHT, NULL, (APTR) UnderlineCGadClicked,
  82. };
  83.  
  84. static ULONG *ShowFontGTags[] =
  85. {
  86.   (ULONG *) (GTCB_Checked), (ULONG *) TRUE, (ULONG *) (TAG_DONE),
  87.   (ULONG *) (TAG_DONE),
  88.   (ULONG *) (TAG_DONE),
  89.   (ULONG *) (TAG_DONE),
  90. };
  91.  
  92. static long bevelbox[4];
  93.  
  94. LIBRARY *LayersBase = NULL;
  95.  
  96. static void
  97. unclipWindow (WINDOW * win)
  98. {
  99.   REGION *old_region;
  100.  
  101.   if (NULL != (old_region = InstallClipRegion (win->WLayer, NULL)))
  102.     DisposeRegion (old_region);
  103. }
  104.  
  105. static void
  106. clipWindow (WINDOW * win, LONG minX, LONG minY, LONG maxX, LONG maxY)
  107. {
  108.   REGION *new_region;
  109.   RECTANGLE my_rectangle;
  110.  
  111.   my_rectangle.MinX = minX;
  112.   my_rectangle.MinY = minY;
  113.   my_rectangle.MaxX = maxX;
  114.   my_rectangle.MaxY = maxY;
  115.  
  116.   /* get a new region and OR in the limits. */
  117.   if ((new_region = NewRegion ()) != NULL)
  118.     {
  119.       if (OrRectRegion (new_region, &my_rectangle) == FALSE)
  120.     {
  121.       DisposeRegion (new_region);
  122.       new_region = NULL;
  123.     }
  124.     }
  125.  
  126.   InstallClipRegion (win->WLayer, new_region);
  127.  
  128.   return;
  129. }
  130.  
  131. static void
  132. ShowFontRender (TEXTATTR * tfont)
  133. {
  134.   INTUITEXT it;
  135.   int ilen;
  136.  
  137.   EraseRect (ShowFontWnd->RPort,
  138.          bevelbox[0] + 2, bevelbox[1] + 1,
  139.          bevelbox[0] + bevelbox[2] - 3, bevelbox[1] + bevelbox[3] - 2);
  140.  
  141.   CopyMem ((char *) &ShowFontIText[0], (char *) &it, (long) sizeof (INTUITEXT));
  142.  
  143.   it.IText = (STRPTR) testtext;
  144.   it.ITextFont = tfont;
  145.  
  146.   ilen = IntuiTextLength (&it);
  147.  
  148.   it.LeftEdge = bevelbox[0] + ((bevelbox[2] - ilen) / 2);
  149.   it.LeftEdge = (it.LeftEdge < bevelbox[0]) ? bevelbox[0] + 2 : it.LeftEdge;
  150.  
  151.   it.TopEdge = bevelbox[1] + ((bevelbox[3] - tfont->ta_YSize) / 2);
  152.   it.TopEdge = (it.TopEdge < bevelbox[1]) ? bevelbox[1] + 1 : it.TopEdge;
  153.  
  154.   PrintIText (ShowFontWnd->RPort, &it, 0, 0);
  155.  
  156.   return;
  157. }
  158.  
  159. static int
  160. OpenShowFontWindow (void)
  161. {
  162.   NEWGADGET ng;
  163.   GADGET *g;
  164.   UWORD lc, tc;
  165.   UWORD wleft = ShowFontLeft, wtop = ShowFontTop, ww, wh;
  166.   int gl[] =
  167.   {0};
  168.  
  169.   AdjustWindowDimensions (Scr, ShowFontLeft, ShowFontTop, ShowFontWidth, ShowFontHeight,
  170.               &wleft, &wtop, &ww, &wh);
  171.  
  172.   if (!(g = CreateContext (&ShowFontGList)))
  173.     return 1L;
  174.  
  175.   for (lc = 0, tc = 0; lc < 4; lc++)
  176.     {
  177.       CopyMem ((char *) &ShowFontNGad[lc], (char *) &ng,
  178.            (long) sizeof (NEWGADGET));
  179.  
  180.       ng.ng_VisualInfo = VisualInfo;
  181.       ng.ng_TextAttr = Font;
  182.       ng.ng_LeftEdge = OffX + ComputeX (ng.ng_LeftEdge);
  183.       ng.ng_TopEdge = OffY + ComputeY (ng.ng_TopEdge);
  184.       ng.ng_Width = ComputeX (ng.ng_Width);
  185.       ng.ng_Height = ComputeY (ng.ng_Height);
  186.  
  187.       ShowFontGadgets[lc] = g = CreateGadgetA ((ULONG) ShowFontGTypes[lc], g, &ng, (TAGITEM *) & ShowFontGTags[tc]);
  188.       makelabelvisible (ShowFontGadgets[lc]);
  189.  
  190.       while (ShowFontGTags[tc])
  191.     tc += 2;
  192.  
  193.       tc++;
  194.  
  195.       if (NOT g)
  196.     return 2L;
  197.     }
  198.  
  199.   bevelbox[0] = OffX + ComputeX ((UWORD) 12);
  200.   bevelbox[1] = OffY + ComputeY ((UWORD) 5);
  201.   bevelbox[2] = (long) ComputeX ((UWORD) 477);
  202.   bevelbox[3] = (long) ComputeY ((UWORD) 93);
  203.  
  204.   sprintf (testtext, "(%ld) %s", testfont.ta_YSize, testfont.ta_Name);
  205.  
  206.   if (!(ShowFontWnd = OpenWindowTags (NULL,
  207.                       WA_Left, wleft,
  208.                       WA_Top, wtop,
  209.                       WA_Width, ww,
  210.                       WA_Height, wh,
  211.                       WA_IDCMP,
  212.            TEXTIDCMP | CHECKBOXIDCMP | BUTTONIDCMP | IDCMP_CLOSEWINDOW |
  213.                       IDCMP_REFRESHWINDOW | VANILLAKEY,
  214.           WA_Flags, WFLG_DRAGBAR | WFLG_DEPTHGADGET | WFLG_CLOSEGADGET |
  215.               WFLG_SMART_REFRESH | WFLG_ACTIVATE | WFLG_RMBTRAP,
  216.                       WA_Title, ShowFontWdt,
  217.                       WA_PubScreenFallBack, TRUE,
  218.                       WA_PubScreen, Scr,
  219.                       TAG_DONE)))
  220.     return 4L;
  221.  
  222.   RefreshRastPort (ShowFontWnd, ShowFontGadgets, gl, 0, FALSE, ShowFontGList);
  223.  
  224.   EraseRect (ShowFontWnd->RPort,
  225.          bevelbox[0] + 2, bevelbox[1] + 1,
  226.          bevelbox[0] + bevelbox[2] - 3, bevelbox[1] + bevelbox[3] - 2);
  227.  
  228.   DrawBevelBox (ShowFontWnd->RPort,
  229.         bevelbox[0], bevelbox[1],
  230.         bevelbox[2], bevelbox[3],
  231.         GT_VisualInfo, VisualInfo,
  232.         GTBB_Recessed, TRUE,
  233.         TAG_DONE);
  234.  
  235.   clipWindow (ShowFontWnd, bevelbox[0] + 4, bevelbox[1] + 2,
  236.           bevelbox[0] + bevelbox[2] - 6, bevelbox[1] + bevelbox[3] - 4);
  237.  
  238.   ShowFontRender (&testfont);
  239.  
  240.   GT_RefreshWindow (ShowFontWnd, NULL);
  241.  
  242.   return 0L;
  243. }
  244.  
  245. static int flags[4] =
  246. {TRUE, FALSE, FALSE, FALSE}, defflags[4] =
  247. {TRUE, FALSE, FALSE, FALSE};
  248. static int attributes[4] =
  249. {FS_NORMAL, FSF_ITALIC, FSF_BOLD, FSF_UNDERLINED};
  250.  
  251. static void
  252. SetAttr (int attrib)
  253. {
  254.   int i;
  255.   int newattr;
  256.  
  257.   if (attrib != FS_NORMAL)
  258.     {
  259.       newattr = 0;
  260.  
  261.       for (i = 0; i < 4; i++)
  262.     newattr |= (flags[i] == TRUE) ? attributes[i] : 0;
  263.     }
  264.   else
  265.     newattr = FS_NORMAL;
  266.  
  267.   testfont.ta_Style = newattr;
  268.  
  269.   ShowFontRender (&testfont);
  270.  
  271.   return;
  272. }
  273.  
  274. static void
  275. Set (int num, int checked)
  276. {
  277.   flags[num - GD_NormalCGad] = checked;
  278.  
  279.   GT_SetGadgetAttrs (ShowFontGadgets[num - GD_NormalCGad], ShowFontWnd,
  280.              NULL,
  281.              GTCB_Checked, flags[num - GD_NormalCGad],
  282.              TAG_DONE);
  283.  
  284.   return;
  285. }
  286.  
  287. static void
  288. IsNoAttrib (void)
  289. {
  290.   if (!flags[1] && !flags[2] && !flags[3])
  291.     Set ((int) GD_NormalCGad, TRUE);
  292.  
  293.   return;
  294. }
  295.  
  296. static int
  297. NormalCGadClicked (void)
  298. {
  299.   int i;
  300.  
  301.   if (!flags[GD_NormalCGad - GD_NormalCGad])
  302.     SetAttr (attributes[0]);
  303.  
  304.   Set ((int) GD_NormalCGad, TRUE);
  305.  
  306.   for (i = GD_ItalicCGad; i <= GD_UnderlineCGad; i++)
  307.     Set (i, FALSE);
  308.  
  309.   return TRUE;
  310. }
  311.  
  312. static int
  313. ItalicCGadClicked (void)
  314. {
  315.   /* routine when gadget "Italic" is clicked. */
  316.   Set ((int) GD_NormalCGad, FALSE);
  317.  
  318.   flags[GD_ItalicCGad - GD_NormalCGad] = (flags[GD_ItalicCGad - GD_NormalCGad] == TRUE) ? FALSE : TRUE;
  319.  
  320.   SetAttr (attributes[1]);
  321.  
  322.   IsNoAttrib ();
  323.  
  324.   return TRUE;
  325. }
  326.  
  327. static int
  328. BoldCGadClicked (void)
  329. {
  330.   /* routine when gadget "Bold" is clicked. */
  331.   Set ((int) GD_NormalCGad, FALSE);
  332.  
  333.   flags[GD_BoldCGad - GD_NormalCGad] = (flags[GD_BoldCGad - GD_NormalCGad] == TRUE) ? FALSE : TRUE;
  334.  
  335.   SetAttr (attributes[2]);
  336.  
  337.   IsNoAttrib ();
  338.  
  339.   return TRUE;
  340. }
  341.  
  342. static int
  343. UnderlineCGadClicked (void)
  344. {
  345.   /* routine when gadget "Underline" is clicked. */
  346.   Set ((int) GD_NormalCGad, FALSE);
  347.  
  348.   flags[GD_UnderlineCGad - GD_NormalCGad] = (flags[GD_UnderlineCGad - GD_NormalCGad] == TRUE) ? FALSE : TRUE;
  349.  
  350.   SetAttr (attributes[3]);
  351.  
  352.   IsNoAttrib ();
  353.  
  354.   return TRUE;
  355. }
  356.  
  357. static int
  358. HandleShowFontIDCMP (void)
  359. {
  360.   INTUIMESSAGE *m;
  361.   int (*func) (void);
  362.   BOOL running = TRUE;
  363.   GADGET *gad;
  364.  
  365.   while (m = GT_GetIMsg (ShowFontWnd->UserPort))
  366.     {
  367.       CopyMem ((char *) m, (char *) &ShowFontMsg,
  368.            (long) sizeof (INTUIMESSAGE));
  369.  
  370.       GT_ReplyIMsg (m);
  371.  
  372.       switch (ShowFontMsg.Class)
  373.     {
  374.     case IDCMP_REFRESHWINDOW:
  375.       GT_BeginRefresh (ShowFontWnd);
  376.       GT_EndRefresh (ShowFontWnd, TRUE);
  377.       break;
  378.  
  379.     case IDCMP_VANILLAKEY:
  380.       if ((char) ShowFontMsg.Code == ESC)
  381.         running = FALSE;
  382.       break;
  383.  
  384.     case IDCMP_CLOSEWINDOW:
  385.       running = FALSE;
  386.       break;
  387.  
  388.     case IDCMP_GADGETUP:
  389.       gad = (GADGET *) ShowFontMsg.IAddress;
  390.       HandleHelp ((enum RSysNumbers) gad->GadgetID);
  391.  
  392.       func = (int (*)()) (gad->UserData);
  393.       running = func ();
  394.       break;
  395.     }
  396.     }
  397.  
  398.   return running;
  399. }
  400.  
  401. void
  402. ShowFont (TEXTFONT * tf)
  403. {
  404.   int i;
  405.  
  406.   DPOS;
  407.  
  408.   PrintInfo ("Show font", SPEAK, 0);
  409.  
  410.   if (LayersBase = OpenLibrary ((STRPTR) "layers.library", 36))
  411.     {
  412.       LockMainWindow (WIN_LOCK);
  413.  
  414.       for (i = 0; i < 4; i++)
  415.     flags[i] = defflags[i];
  416.  
  417.       testtext = MyAllocVec (strlen (tf->tf_Message.mn_Node.ln_Name) + 10, MEMF_CLEAR, NO_KILL);
  418.  
  419.       if (testtext)
  420.     {
  421.       testfont.ta_Name = (STRPTR) tf->tf_Message.mn_Node.ln_Name;
  422.       testfont.ta_YSize = tf->tf_YSize;
  423.       testfont.ta_Style = 0;
  424.       testfont.ta_Flags = 0;
  425.  
  426.       if (OpenASysWindow (OpenShowFontWindow, NO_KILL))
  427.         {
  428.           while (HandleShowFontIDCMP ());
  429.  
  430.           unclipWindow (ShowFontWnd);
  431.  
  432.           CloseASysWindow (&ShowFontWnd, &ShowFontGList, NULL);
  433.         }
  434.  
  435.       MyFreeVec (testtext);
  436.     }
  437.  
  438.       CloseLibrary (LayersBase);
  439.       LayersBase = NULL;
  440.  
  441.       LockMainWindow (WIN_UNLOCK);
  442.     }
  443.   else
  444.     ErrorHandle ("layers.library", LIBRARY_ERR, OPEN_FAIL, KILL);
  445.  
  446.   PrintStatistics ();
  447.  
  448.   return;
  449. }
  450.